package com.biz.primus.ms.payment.channel.allinpay.req;

import com.biz.primus.common.utils.JsonUtils;
import com.biz.primus.ms.payment.channel.allinpay.res.AllInPayCardBackDataRespVo;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.client.RestTemplate;

import java.util.HashMap;
import java.util.Map;
import java.util.TreeSet;

/**
 * AllInPayCardRefund
 *
 * @author JKLiues
 * @date 2017年11月16日
 */
@Getter
@Setter
@Slf4j
public class AllInPayCardRefund extends AllInPayRequestBase {
    private static final String API_URL = "http://116.228.64.55:8080/aop/rest";

    /**
     * AOP分配给应用的AppKey
     */
    private String app_key;
    /**
     * API接口名称
     */
    private String method = "allinpay.ppcs.cardback.add";
    /**
     * 时间戳，格式为yyyyMMddHHmmss，例如：20110125010101。API服务端允许客户端请求时间误差为30分钟。
     */
    private String timestamp;
    /**
     * API协议版本，可选值:1.0。
     */
    private String v = "1.0";
    /**
     * 签名版本
     */
    private String sign_v = "1.0";

    /**
     * 可选，指定响应格式。默认xml,目前支持格式为xml,json
     */
    private String format = "json";

    /**
     * 订单号
     */
    private String order_id;
    /**
     * 原交易订单号
     */
    private String ori_order_id;
    /**
     * 商户号
     */
    private String mer_id;
    /**
     * 交易日期
     */
    private String trans_date;
    /**
     * 退货金额（分为单位，如100代表1元）
     */
    private Integer amount;
    /**
     * 退货订单号
     */
    private String back_order_id;
    /**
     * 备注（最多64位）
     */
    private String misc;


    public AllInPayCardBackDataRespVo execute(String sign) {
        Map<String, Object> map = new HashMap<>();
        map.put("app_key", this.app_key);
        map.put("method", this.method);
        map.put("timestamp", this.timestamp);
        map.put("v", this.v);
        map.put("sign_v", this.sign_v);
        map.put("format", this.format);
        map.put("order_id", this.order_id);
        map.put("ori_order_id", this.ori_order_id);
        map.put("mer_id", this.mer_id);
        map.put("trans_date", this.trans_date);
        map.put("amount", this.amount);
        map.put("back_order_id", this.back_order_id);
        map.put("misc", this.misc);
        map.put("sign", sign);
        RestTemplate restTemplate = getRestTemplate();
        String finalUrl = buildUrl(getApiUrl(), map);
        String forObject = restTemplate.getForObject(finalUrl, String.class);
        return JsonUtils.json2Obj(forObject, AllInPayCardBackDataRespVo.class);
    }

    @Override
    protected String getApiUrl() {
        return API_URL;
    }

    @Override
    public TreeSet<String> getSignParams() {
        return Sets.newTreeSet(Lists.newArrayList(
                "app_key",
                "method",
                "timestamp",
                "v",
                "sign_v",
                "format",
                "order_id",
                "ori_order_id",
                "mer_id",
                "trans_date",
                "amount",
                "back_order_id",
                "misc"
        ));
    }
}